#include <iostream>

// 构造函数分类和使用
// 1. 无参构造函数
// 2. 有参构造函数
// 3. 拷贝构造函数

class Person
{
public:
    int age;
    // 无参构造函数
    Person()
    {
        std::cout << "no parameter constructor called!" << std::endl;
    }

    // 有参构造函数
    Person(int a)
    {
        age = a;
        std::cout << "parameter constructor called!" << std::endl;
    }

    // 拷贝构造函数
    Person(const Person &p)
    {
        // 拷贝构造函数中，将传入的对象的所有属性，拷贝到正在创建的对象中
        age = p.age;
        std::cout << "copy constructor called!" << std::endl;
    }

    ~Person()
    {
        std::cout << "destructor called!" << std::endl;
    }
};

// 构造函数的调用方法
// 1. 括号法
void test01()
{
    Person p1;               // 无参构造函数，调用时不加括号
    Person p2(10);          // 有参构造函数
    Person p3(p2);         // 拷贝构造函数
    //std::cout << "p2.age = " << p2.age << std::endl;
    //std::cout << "p3.age = " << p3.age << std::endl;

    // 2. 显示法
    Person p4 = Person(10); // 有参构造函数
    Person p5 = Person(p2); // 拷贝构造函数
    //std::cout << "p4.age = " << p4.age << std::endl;
    //std::cout << "p5.age = " << p5.age << std::endl;

    // 3. 隐式转换法
    Person p6 = 10; // 有参构造函数
    // Person(10); // 匿名对象，调用时不加括号，在当前行结束后，会立即调用析构函数
    //std::cout << "p6.age = " << p6.age << std::endl;
}

int main()
{
    test01();
    return 0;
}